package slice

func calCapacity(capacity, length int) (int, bool) {

	// 当容量小于64时， 则不需要缩容
	if capacity <= 64 {
		return capacity, false
	}

	// 2.当容量大于2048， 且切片的长度小于容量的一半时， 缩容百分之二十五
	if capacity > 2048 && (capacity/length >= 2) {
		factor := 0.75
		return int(float64(capacity) * factor), true
	}

	// 3. 当容量小于, 且切片的长度小于容量的四分之一时， 缩容百分之五十
	if capacity <= 2048 && (capacity/length >= 4) {
		return int(capacity / 2), true
	}

	// 4. 不满足以上条件，则不进行容量调整
	return capacity, false
}

func Shrink[T any](src []T) []T {
	c, l := cap(src), len(src)
	n, change := calCapacity(c, l)
	// 无需要调整则直接返回
	if !change {
		return src
	}
	s := make([]T, 0, n)
	s = append(s, src...)
	return s
}
